package dbmanager

import (
	"database/sql/driver"

	"gitee.com/night-tc/gobige/msgdef"
)

// IDataBaseModel.go 文件定义了数据库管理相关的核心接口。
// 主要包括：
// 1. IDataBaseModel：可以被DB管理器管理的类需要实现的接口，定义了数据模型的基本操作。
// 2. IPlayerSubBase：支持一表多行的数据模型接口，每一行都会有一个自己的ID。
// 3. IDeleted：支持数据删除操作的接口。
// 4. IRedisValuer：用于Redis保存数据的接口。
// 5. ISetArgs：支持设置标脏的接口。
// 6. IReal：用于DBResolveModel分解字段时获取真实数据模型的接口。

// IDataBaseModel 可以被DB管理器管理的类需要实现的接口
type IDataBaseModel interface {
	IDeleted
	// KeyName 数据的唯一名字
	KeyName() string
	// GetPID 用户主键
	GetPID() uint64
	// TableName 拿到表名
	TableName() string
	// Marshal 序列化
	Marshal() ([]byte, error)
	// Unmarshal 反序列化
	Unmarshal(data []byte) error
	// GetIsPartial 是否支持部分更新
	GetIsPartial() bool
}

// IPlayerSubBase 支持一表多行的数据模型接口，每一行都会有一个自己的ID
type IPlayerSubBase interface {
	IDataBaseModel
	// GetID 获取主键ID
	GetID() uint64
	// SetID 设置主键ID
	SetID(id uint64)
}

// IDeleted 支持数据删除操作的接口
type IDeleted interface {
	// IsDeleted 判断数据是否被删除
	IsDeleted() bool
	// SetDelete 标记数据为已删除
	SetDelete()
	// RevokeDelete 撤销删除
	RevokeDelete()
}

// IRedisValuer 用于Redis保存数据的接口
type IRedisValuer interface {
	// RedisValue 返回Redis保存的数据
	RedisValue() (driver.Value, error)
}

// ISetArgs 支持设置标脏的接口
type ISetArgs interface {
	// SetArgs 设置标脏
	SetArgs(args msgdef.IArgs)
}

// IReal 用于DBResolveModel分解字段时获取真实数据模型的接口
type IReal interface {
	IDataBaseModel
	// GetMDReal 获取DB使用的真实数据模型
	GetMDReal() IDataBaseModel
}

type ITable interface {
	// KeyName 数据的唯一名字
	KeyName() string
	// TableName 拿到表名
	TableName() string
	// Marshal 序列化
	Marshal() ([]byte, error)
	// Unmarshal 反序列化
	Unmarshal(data []byte) error
}
